package com.yunke.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yunke.entity.YunkeDistributorCommission;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 分销佣金记录 Mapper 接口
 *
 * @author yunke
 * @since 1.0.0
 */
@Mapper
public interface YunkeDistributorCommissionMapper extends BaseMapper<YunkeDistributorCommission> {

    /**
     * 分页查询佣金记录
     *
     * @param page 分页参数
     * @param distributorId 分销商ID
     * @param commissionType 佣金类型
     * @param commissionStatus 佣金状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 佣金记录列表
     */
    IPage<YunkeDistributorCommission> selectCommissionPage(
            Page<YunkeDistributorCommission> page,
            @Param("distributorId") Long distributorId,
            @Param("commissionType") Integer commissionType,
            @Param("commissionStatus") Integer commissionStatus,
            @Param("startTime") Long startTime,
            @Param("endTime") Long endTime
    );

    /**
     * 统计分销商佣金汇总
     *
     * @param distributorId 分销商ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 佣金汇总
     */
    Map<String, Object> selectCommissionSummary(
            @Param("distributorId") Long distributorId,
            @Param("startTime") Long startTime,
            @Param("endTime") Long endTime
    );

    /**
     * 统计分销商各类型佣金
     *
     * @param distributorId 分销商ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 各类型佣金列表
     */
    List<Map<String, Object>> selectCommissionByType(
            @Param("distributorId") Long distributorId,
            @Param("startTime") Long startTime,
            @Param("endTime") Long endTime
    );

    /**
     * 统计分销商各等级佣金
     *
     * @param distributorId 分销商ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 各等级佣金列表
     */
    List<Map<String, Object>> selectCommissionByLevel(
            @Param("distributorId") Long distributorId,
            @Param("startTime") Long startTime,
            @Param("endTime") Long endTime
    );

    /**
     * 查询待结算佣金列表
     *
     * @param distributorId 分销商ID
     * @return 待结算佣金列表
     */
    List<YunkeDistributorCommission> selectPendingCommissions(@Param("distributorId") Long distributorId);

    /**
     * 批量更新佣金状态
     *
     * @param commissionIds 佣金ID列表
     * @param newStatus 新状态
     * @param settleBatchNo 结算批次号
     * @param settleTime 结算时间
     * @return 更新行数
     */
    int batchUpdateStatus(
            @Param("commissionIds") List<Long> commissionIds,
            @Param("newStatus") Integer newStatus,
            @Param("settleBatchNo") String settleBatchNo,
            @Param("settleTime") Long settleTime
    );

    /**
     * 统计分销商今日佣金
     *
     * @param distributorId 分销商ID
     * @return 今日佣金
     */
    BigDecimal selectTodayCommission(@Param("distributorId") Long distributorId);

    /**
     * 统计分销商昨日佣金
     *
     * @param distributorId 分销商ID
     * @return 昨日佣金
     */
    BigDecimal selectYesterdayCommission(@Param("distributorId") Long distributorId);

    /**
     * 统计分销商本周佣金
     *
     * @param distributorId 分销商ID
     * @return 本周佣金
     */
    BigDecimal selectWeekCommission(@Param("distributorId") Long distributorId);

    /**
     * 统计分销商本月佣金
     *
     * @param distributorId 分销商ID
     * @return 本月佣金
     */
    BigDecimal selectMonthCommission(@Param("distributorId") Long distributorId);

    /**
     * 查询佣金趋势图数据
     *
     * @param distributorId 分销商ID
     * @param days 天数
     * @return 趋势图数据
     */
    List<Map<String, Object>> selectCommissionTrend(@Param("distributorId") Long distributorId, @Param("days") Integer days);
} 